package Algoritmo;

import Grafica.Vertice;
import InterfazPantera.PanteraView;

/**
 *
 * @author robertoanzaldua
 */
public class Dijkstra extends AlgoritmoDistancia{
    //los pesos de las aristas
    int[][]w;
    int W;
    int adic;


    public Dijkstra(PanteraView interfaz){
        super(interfaz,"Dijkstra");
        w = getPesos();
        if(G.getVertices()!=null){
            for(Vertice v1 : G.getVertices())
                for(Vertice v2 : v1.ady())
                    if(v1.nV()<v2.nV())
                        marcaArista(v1.nV(),v2.nV(),"\""+color+"\", label=\""+
                                w[v2.nV()][v1.nV()]+"\"", false);

            dibuja(d,p());
            add = 3;
        }
    }

    /**Regresa el peso asignado a la arista (i,j)
     * 
     * @param i El índice de algún vértice
     * @param j El índice de algún vértice
     * @return int, el peso de la arista
     */
    public int w(int i, int j){
        return i<j ? w[j][i] : w[i][j];
    }

    /**Marca la arista u,v con su peso.
     *
     */
   protected void mA(){
       marcaArista(u.nV(), v.nV(),"\""+b + " 1 1\", label=\""+w(u.nV(),v.nV())+"\"", true);
   }

    protected void asignaV(){
       v = u.elimina();
       W = w(u.nV(),v.nV());
       agregaADesarrollo("v ← "+v.ID()+"\n\n");
       agregaADesarrollo("w ← "+w(u.nV(),v.nV())+"\n");
   }

    protected Vertice asignaU(){
        Vertice r = C.element();
        for(Vertice V : C)
            if(d[V.nV()]<d[r.nV()])
                r = V;
        return r;
    }

    protected int dist(){
        return W;
    }

    protected int mueve(int i){
        return i==1 ? 5 : clics1;
    }

    @Override
    protected void adicionales(){
        switch(adic%3){
            case 0:
                cambiaPaso(nulo(10) ? 7 : 10, 11);
                boolean mQ = d[v.nV()] > d[u.nV()]+W;
                clics1 = mQ ? 5 : 0;
                adic = mQ ? adic : -1;
                agregaADesarrollo("v.d = "+d[v.nV()]+" y u.d + W = "+(d[u.nV()]+W)+", por lo tanto\n");
                agregaADesarrollo(v.ID()+".d "+(mQ ? "" : "no ")+"es mayor que "+u.ID()+".d"+W+"\n");
                break;
            case 1:
                cambiaPaso(11,12);
                cicloVAdy3();
                clics1--;
                break;
            case 2:
                cambiaPaso(12,13);
                cicloVAdy4();
                clics1 = 0;
                break;
        }
        adic++;
    }
}
